<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //1、新增的 API
            // keys(obj)：获取对象的所有 key 形成的数组 
            // values(obj)：获取对象的所有 value 形成的数组 
            // entries(obj)：获取对象的所有 key 和 value 形成的二维数组。格式：`[[k1,v1],[k2,v2],...]` 
            // assign(dest, ...src) ：将多个 src 对象的值 拷贝到 dest 中。（第一层为深拷贝，第二层为浅 拷贝）
        const person = {
            "name":"解构表达式",
            "age":9999,
            "language":['java','python','js','css']
        }
        console.log(Object.keys(person));//["name", "age", "language"] 
        console.log(Object.values(person));//["解构表达式", 9999, Array(4)] 
        console.log(Object.entries(person));//[["name":"解构表达式"],["age":9999],["language",Array(4)]]

        const target = { a: 1 }; 
        const source1 = { b: 2 }; 
        const source2 = { c: 3 }; 
        //Object.assign 方法的第一个参数是目标对象，后面的参数都是源对象。 
        Object.assign(target, source1, source2); 
        console.log(target)//{a: 1, b: 2, c: 3}

        //2、声明对象简写
        const age = 23;
        const name = "张三";
        // 传统 
        const person1 = {
            age: age, 
            name: name 
        };
        console.log(person1);//{age: 23, name: "张三"}

        // ES6：属性名和属性值变量名一样，可以省略
        const person2 = { age, name };
        console.log(person2);//{age: 23, name: "张三"}

        //3、对象的函数属性简写
        let person = {
            name: "jack", 
            // 以前： 
            eat: function (food) { console.log(this.name + "在吃" + food); },
            // 箭头函数版：这里拿不到 this 
            eat2: food => console.log(person.name + "在吃" + food), 
            // 简写版： 
            eat3(food) { console.log(this.name + "在吃" + food); } 
        }
        person.eat("apple");


        //4、对象拓展运算符
        // 1)拷贝对象（深拷贝） 
        let person11 = { name: "Amy", age: 15 };
        let someone = { ...person11 };
        console.log(someone);//{name: "Amy", age: 15}
        // 2、合并对象 
        let age = { age: 15 };
        let name = { name: "Amy" };
        let person22 = { ...age, ...name };
        //如果两个对象的字段名重复，后面对象字 段值会覆盖前面对象的字段值 
        console.log(person22); //{age: 15, name: "Amy"}
    </script>
</body>
</html>